<html>
	<head>
		<title>clocking fun</title>
		<style type="text/css">
			@import "../../../dojo/resources/dojo.css";
		</style>
		<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true"></script>
		<script type="text/javascript" src="../functional.js"></script>
		<script type="text/javascript" src="../functional/sequence.js"></script>
		<script type="text/javascript" src="../functional/fold.js"></script>
		<script type="text/javascript">
			dojo.addOnLoad(function(){
				var LEN = 2000, ITER = 200, b, e, tests = {},
					df = dojox.lang.functional,
					sample = df.repeat(LEN, "+1", 0),
					add = df.lambda("+"),
					isOdd = df.lambda("%2");
					
				var clock = function(body){
					var b = new Date();
					body();
					var e = new Date();
					return e.getTime() - b.getTime();	// in ms
				};
				
				var log = function(name, body){
					b = new Date();
					var ms = clock(body);
					e = new Date();
					console.log(name + ":", ms);
				};

				// filter
				tests["raw filter"] = function(){
					for(var i = 0; i < ITER; ++i){
						var t = [];
						for(var j = 0; j < sample.length; ++j){
							if(isOdd(sample[j])){ t.push(sample[j]); }
						}
					}
				};
				tests["dojo.filter"] = function(){
					for(var i = 0; i < ITER; ++i){
						dojo.filter(sample, isOdd);
					}
				};
				tests["df.filter"] = function(){
					for(var i = 0; i < ITER; ++i){
						df.filter(sample, isOdd);
					}
				};
				if(sample.filter){
					tests["Array.prototype.filter"] = function(){
						for(var i = 0; i < ITER; ++i){
							sample.filter(isOdd);
						}
					};
				}

				// map
				tests["raw map"] = function(){
					for(var i = 0; i < ITER; ++i){
						var t = [];
						for(var j = 0; j < sample.length; ++j){
							t.push(isOdd(sample[j]));
						}
					}
				};
				tests["dojo.map"] = function(){
					for(var i = 0; i < ITER; ++i){
						dojo.map(sample, isOdd);
					}
				};
				tests["df.map"] = function(){
					for(var i = 0; i < ITER; ++i){
						df.map(sample, isOdd);
					}
				};
				if(sample.map){
					tests["Array.prototype.map"] = function(){
						for(var i = 0; i < ITER; ++i){
							sample.map(isOdd);
						}
					};
				}

				// forEach
				tests["raw forEach"] = function(){
					for(var i = 0; i < ITER; ++i){
						for(var j = 0; j < sample.length; ++j){
							isOdd(sample[j]);
						}
					}
				};
				tests["dojo.forEach"] = function(){
					for(var i = 0; i < ITER; ++i){
						dojo.forEach(sample, isOdd);
					}
				};
				tests["df.forEach"] = function(){
					for(var i = 0; i < ITER; ++i){
						df.forEach(sample, isOdd);
					}
				};
				if(sample.forEach){
					tests["Array.prototype.forEach"] = function(){
						for(var i = 0; i < ITER; ++i){
							sample.forEach(isOdd);
						}
					};
				}

				// reduce
				tests["raw reduce"] = function(){
					for(var i = 0; i < ITER; ++i){
						var z = 0;
						for(var j = 0; j < sample.length; ++j){
							z = add(z, sample[j]);
						}
					}
				};
				tests["df.reduce"] = function(){
					for(var i = 0; i < ITER; ++i){
						df.reduce(sample, add, 0);
					}
				};
				if(sample.reduce){
					tests["Array.prototype.reduce"] = function(){
						for(var i = 0; i < ITER; ++i){
							sample.reduce(add, 0);
						}
					};
				}

				// reduceRight
				tests["raw reduceRight"] = function(){
					for(var i = 0; i < ITER; ++i){
						var z = 0;
						for(var j = sample.length - 1; j >= 0; --j){
							z = add(z, sample[j]);
						}
					}
				};
				tests["df.reduceRight"] = function(){
					for(var i = 0; i < ITER; ++i){
						df.reduceRight(sample, add, 0);
					}
				};
				if(sample.reduceRight){
					tests["Array.prototype.reduceRight"] = function(){
						for(var i = 0; i < ITER; ++i){
							sample.reduceRight(add, 0);
						}
					};
				}
				
				var keys = df.keys(tests), i = 0;
				
				var doTest = function(){
					log(keys[i], tests[keys[i]]);
					++i;
					if(i < keys.length){
						setTimeout(doTest, 1);
					}else{
						console.log("that's all");
					}
				};
				
				setTimeout(doTest, 1);
			});
		</script>
	</head>
	<body>
		<p>This test is meant to run with Firebug.</p>
	</body>
</html>
